 /**
 * 文件名称: framebuffer.h
 * 摘    要: linux framebuffer基本操作头文件
 * 来    源: 参考朱有鹏老师嵌入式linux核心课程中《图片解码播放器》编写的图片播放器工程
 *
 * 当前版本: 2.0
 * 作    者: huenrong
 * 完成日期: 2019-07-28
 **/


#ifndef __FRAMEBUFFER_H
#define __FRAMEBUFFER_H

#ifdef __cplusplus
extern "C" {
#endif

#define     FB_DEVICE       "/dev/fb0"

// 开发板屏幕尺寸
#define     SCREEN_WIDTH    1024        // 屏幕宽度
#define     SCREEN_HEIGHT   600         // 屏幕高度

// 颜色码(参考百度百科十六进制颜色码)
#define     WHITE           0xFFFFFF        // 纯白色
#define     BLACK           0x000000        // 纯黑色
#define     RED             0xFF0000        // 纯红色
#define     ORANGERED       0xFF4500        // 橙红色
#define     YELLOW          0xFFFF00        // 纯黄色
#define     GREEN           0x008000        // 纯绿色
#define     BLUE            0x0000FF        // 纯蓝色
#define     INDIGO          0x4B0082        // 靛青色
#define     CYAN            0x00FFFF        // 青色
#define     PURPLE          0x800080        // 紫色


// 结构体用来封装一个图片的各种信息
struct picture_info
{
	unsigned int width; // 图片分辨率之宽
	unsigned int height;// 图片分辨率之高
	unsigned int bpp;   // 图片bpp
	char *data;         // 指针指向图片有效数据
};


/******************************************************************************
函数名称: open_framebuffer
函数功能: 打开framebuffer
函数参数: 无
函数返回: 成功: 返回打开framebuffer的文件描述符
          失败: 返回-1
******************************************************************************/
int open_framebuffer(void);

/******************************************************************************
函数名称: close_framebuffer
函数功能: 关闭framebuffer
函数参数: fd: framebuffer文件描述符
函数返回: 成功: 0
          失败: 返回-1
******************************************************************************/
int close_framebuffer(int fd);

/******************************************************************************
函数名称: framebuffer_draw_point
函数功能: framebuffer画点
函数参数: x: x轴坐标
          y: y轴坐标
          color: 需要绘制的颜色
函数返回: 无
******************************************************************************/
void framebuffer_draw_point(const unsigned int x, const unsigned int y, const unsigned int color);

/******************************************************************************
函数名称: framebuffer_draw_line
函数功能: framebuffer画线
函数参数: start_x: 起始点x坐标
          start_y: 起始点y坐标
          end_x: 结束点x坐标
          end_y: 结束点y坐标
          color: 需要绘制的颜色
函数返回: 无
******************************************************************************/
void framebuffer_draw_line(const int start_x, const int start_y, \
                           const int end_x, const int end_y, \
                           const unsigned int color);

/******************************************************************************
函数名称: framebuffer_draw_wide_line
函数功能: framebuffer画宽线
函数参数: start_x: 起始点x坐标
          start_y: 起始点y坐标
          end_x: 结束点x坐标
          end_y: 结束点y坐标
          color: 需要绘制的颜色
          wide: 指定的线宽
函数返回: 无
******************************************************************************/
void framebuffer_draw_wide_line(const int start_x, const int start_y, \
                           const int end_x, const int end_y, \
                           const unsigned int color, const unsigned char wide);

/******************************************************************************
函数名称: framebuffer_draw_background
函数功能: 绘制屏幕背景色
函数参数: screen_width: 屏幕宽度
          screen_height: 屏幕高度
          color: 需要绘制的颜色
函数返回: 无
******************************************************************************/
void framebuffer_draw_background(const unsigned int screen_width, const unsigned int screen_height, \
                                 const unsigned int color);

/******************************************************************************
函数名称: framebuffer_draw_area
函数功能: 屏幕指定区域绘制颜色(包含指定边界)
函数参数: x_start: x方向起始位置
          x_end: x方向结束位置
          y_start: y方向起始位置
          y_end: y方向结束位置
          color: 需要绘制的颜色
函数返回: 无
******************************************************************************/
void framebuffer_draw_area(const unsigned int x_start, const unsigned int x_end, \
                           const unsigned int y_start, const unsigned int y_end, \
                           const unsigned int color);

/******************************************************************************
函数名称: framebuffer_draw_area
函数功能: 屏幕指定区域绘制颜色(包含指定边界)
函数参数: x0: 圆心坐标x
          y0: 圆心坐标y
          radius: 半径
          color: 需要绘制的颜色
函数返回: 无
******************************************************************************/
void framebuffer_draw_circle(const unsigned int x0, const unsigned int y0, \
                             const unsigned int radius, const unsigned int color);

/******************************************************************************
函数名称: framebuffer_display_picture
函数功能: 屏幕指定位置显示图片
函数参数: x_start: 图片起点坐标x值
          y_start: 图片起点坐标y值
          picture_type: 需要显示的图片类型(0: bmp, 1: jpg, 2: png)
          picture: 需要显示的图片信息
函数返回: 无
******************************************************************************/
void framebuffer_display_picture(const unsigned int x_start, const unsigned int y_start, \
                                 const char picture_type, const struct picture_info *picture);


#ifdef __cplusplus
}
#endif

#endif /* __FRAMEBUFFER_H */